package com.example.orderfood2.RecyclerViewAdapter;

import android.content.Context;
import android.database.Cursor;
import android.icu.text.SimpleDateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.example.orderfood2.R;
import com.example.orderfood2.entity.Student;

import java.text.ParseException;
import java.util.List;
import java.util.Locale;

/**
 * 教师操作学生信息的 RecyclerView 适配器。
 * 用于展示学生列表，并提供编辑和删除功能。
 */
public class TeacherOperateStudentAdapter extends RecyclerView.Adapter<TeacherOperateStudentAdapter.StudentViewHolder> {

    private List<Student> studentList;
    private Context context;
    private TeacherOperateStudentAdapter.OnItemClickListener listener;
    // 4年的毫秒数
    private static final long FOUR_YEARS_MILLIS = 4L * 365 * 24 * 60 * 60 * 1000;
    //处理按钮点击事件

    /**
     * 构造方法，初始化适配器所需的数据和上下文。
     *
     * @param studentList 学生数据列表
     * @param context     上下文对象
     */
    public TeacherOperateStudentAdapter(List<Student> studentList, Context context) {
        this.studentList = studentList;
        this.context = context;
    }

    /**
     * 创建 ViewHolder 实例，加载 item_teacher_operate_student 布局。
     *
     * @param parent   父容器视图组
     * @param viewType 视图类型（本例中未使用）
     * @return 新创建的 StudentViewHolder 实例
     */
    @NonNull
    @Override
    public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_teacher_operate_student, parent, false);
        return new StudentViewHolder(view);
    }

    /**
     * 绑定数据到 ViewHolder 中的控件，并设置点击事件。
     *
     * @param holder   ViewHolder 实例
     * @param position 当前项在列表中的位置
     *
     * RecyclerView 会根据 getItemCount() 返回的数量，循环调用 onBindViewHolder()。
     * 每次调用时，position 参数会从 0 递增到 getItemCount()-1（即遍历整个 studentList）。
     * 在方法内部，通过 studentList.get(position) 获取当前位置的学生数据，再通过 holder 中的控件展示出来（如设置文本、状态等）。
     */
    @Override
    public void onBindViewHolder(@NonNull StudentViewHolder holder, int position) {
        Student student = studentList.get(position);
        int id = student.getId();
        String Username = student.getUsername();
        holder.tvStudentId.setText(String.valueOf(id));
        holder.tvUsername.setText(Username);

        // 根据入学时间判断学生状态（在读/毕业）
        try {
            setStudentStatusWithTimestamp(holder, student.getEnrol());
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

        // 编辑按钮点击事件
        holder.btnEdit.setOnClickListener(v -> {
            if (listener != null) {
                listener.onEditClick(position, id, Username);
            }
        });

        // 删除按钮点击事件
        holder.btnDelete.setOnClickListener(v -> {
            if (listener != null) {
                listener.onDeleteClick(position, id);
            }
        });
//        添加课表事件
        holder.btnAddCourse.setOnClickListener(v -> {
            if (listener != null) {
                listener.onAddCourseClick(position, id);
            }
        });
    }

    /**
     * 获取数据项的数量。
     *getItemCount()：告诉 RecyclerView 有多少条数据需要展示
     * @return 数据列表的大小，若为 null 则返回 0
     */
    @Override
    public int getItemCount() {
        return studentList == null ? 0 : studentList.size();
    }

    /**
     * ViewHolder 类，持有 item_teacher_operate_student 布局中的各个控件引用。
     */
    static class StudentViewHolder extends RecyclerView.ViewHolder {
        TextView tvStudentId, tvUsername, tvState;
        Button btnEdit, btnDelete,btnAddCourse;

        /**
         * 构造方法，初始化 ViewHolder 中的控件。
         *
         * @param itemView item_teacher_operate_student 布局对应的 View 对象
         */
        public StudentViewHolder(@NonNull View itemView) {
            super(itemView);
            tvStudentId = itemView.findViewById(R.id.tv_student_id);
            tvUsername = itemView.findViewById(R.id.tv_username);
            tvState = itemView.findViewById(R.id.tv_state);
            btnEdit = itemView.findViewById(R.id.btn_student_edit);
            btnDelete = itemView.findViewById(R.id.btn_student_delete);
            btnAddCourse=itemView.findViewById(R.id.btn_student_add_course);
        }
    }

    /**
     * 定义点击事件监听接口，供外部实现编辑和删除功能。
     */
    public interface OnItemClickListener {
        /**
         * 编辑按钮点击回调。
         *
         * @param position 当前项的位置
         * @param id       学生ID
         * @param username 学生用户名
         */
        void onEditClick(int position, int id, String username);

        /**
         * 删除按钮点击回调。
         *
         * @param position 当前项的位置
         * @param id       学生ID
         */
        void onDeleteClick(int position, int id);
        void onAddCourseClick(int position, int id);
    }

    /**
     * 设置点击事件监听器。
     *
     * @param listener 实现了 OnItemClickListener 接口的对象
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }

    /**
     * 根据入学日期计算学生状态（在读或毕业）并更新 UI。
     *
     * @param holder     ViewHolder 实例
     * @param enrolDate  入学日期字符串（格式：yyyy-MM-dd）
     * @throws ParseException 如果日期解析失败
     */
    private void setStudentStatusWithTimestamp(StudentViewHolder holder, String enrolDate) throws ParseException {
        try {
            // 1. 将入学日期转换为时间戳,通过 Locale.getDefault() 获取默认的地区设置，能够让数据以符合当地习惯的格式展示
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
            long enrolTimestamp = sdf.parse(enrolDate).getTime();
            // 2. 获取当前时间戳
            long currentTimestamp = System.currentTimeMillis();
            // 3. 计算时间差（毫秒）
            long duration = currentTimestamp - enrolTimestamp;
            // 4. 判断是否超过4年
            if (duration >= FOUR_YEARS_MILLIS) {
                holder.tvState.setText("毕业");
                holder.tvState.setTextColor(ContextCompat.getColor(context, R.color.red));
            } else {
                holder.tvState.setText("在读");
                holder.tvState.setTextColor(ContextCompat.getColor(context, R.color.green));
            }
        } catch (ParseException e) {
            holder.tvState.setText("日期错误");
            holder.tvState.setTextColor(ContextCompat.getColor(context, android.R.color.darker_gray));
        }
    }
}
